/**
 ******************************************************************************
 * @file           : bsp_dma.h
 * @brief          : DMA Driver Header File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * DMA驱动程序头文件
 * 提供DMA配置和管理接口
 * 支持内存到内存、外设到内存、内存到外设传输
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_DMA_H
#define __BSP_DMA_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/

/**
 * @brief DMA传输方向枚举
 */
typedef enum
{
    DMA_DIR_PERIPH_TO_MEMORY = 0,   /*!< 外设到内存 */
    DMA_DIR_MEMORY_TO_PERIPH,       /*!< 内存到外设 */
    DMA_DIR_MEMORY_TO_MEMORY        /*!< 内存到内存 */
} DMA_Direction_e;

/**
 * @brief DMA数据宽度枚举
 */
typedef enum
{
    DMA_DATA_WIDTH_BYTE = 0,        /*!< 8位 */
    DMA_DATA_WIDTH_HALFWORD,        /*!< 16位 */
    DMA_DATA_WIDTH_WORD             /*!< 32位 */
} DMA_DataWidth_e;

/**
 * @brief DMA模式枚举
 */
typedef enum
{
    DMA_MODE_NORMAL = 0,            /*!< 正常模式（单次传输） */
    DMA_MODE_CIRCULAR               /*!< 循环模式（自动重载） */
} DMA_Mode_e;

/**
 * @brief DMA优先级枚举
 */
typedef enum
{
    DMA_PRIORITY_LOW = 0,           /*!< 低优先级 */
    DMA_PRIORITY_MEDIUM,            /*!< 中优先级 */
    DMA_PRIORITY_HIGH,              /*!< 高优先级 */
    DMA_PRIORITY_VERY_HIGH          /*!< 极高优先级 */
} DMA_Priority_e;

/**
 * @brief DMA错误码枚举
 */
typedef enum
{
    DMA_OK = 0,                     /*!< 成功 */
    DMA_ERROR_PARAM,                /*!< 参数错误 */
    DMA_ERROR_BUSY,                 /*!< DMA忙 */
    DMA_ERROR_TIMEOUT,              /*!< 超时 */
    DMA_ERROR_TRANSFER              /*!< 传输错误 */
} DMA_Error_e;

/**
 * @brief DMA配置结构体
 */
typedef struct
{
    DMA_Stream_TypeDef *stream;     /*!< DMA流 */
    uint32_t periph_addr;           /*!< 外设地址 */
    uint32_t memory_addr;           /*!< 内存地址 */
    uint32_t data_num;              /*!< 数据数量 */
    DMA_Direction_e direction;      /*!< 传输方向 */
    DMA_DataWidth_e periph_width;   /*!< 外设数据宽度 */
    DMA_DataWidth_e memory_width;   /*!< 内存数据宽度 */
    DMA_Mode_e mode;                /*!< 传输模式 */
    DMA_Priority_e priority;        /*!< 优先级 */
    uint8_t periph_inc;             /*!< 外设地址递增 */
    uint8_t memory_inc;             /*!< 内存地址递增 */
} DMA_Config_t;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* DMA初始化和配置 */
DMA_Error_e dma_init(const DMA_Config_t *config);
DMA_Error_e dma_deinit(DMA_Stream_TypeDef *stream);

/* DMA传输控制 */
DMA_Error_e dma_start(DMA_Stream_TypeDef *stream);
DMA_Error_e dma_stop(DMA_Stream_TypeDef *stream);
DMA_Error_e dma_transfer(DMA_Stream_TypeDef *stream, uint32_t src_addr, uint32_t dst_addr, uint32_t data_num);

/* DMA状态查询 */
uint8_t dma_is_busy(DMA_Stream_TypeDef *stream);
uint32_t dma_get_counter(DMA_Stream_TypeDef *stream);

/* DMA中断回调（弱函数，用户可重写） */
void dma_transfer_complete_callback(DMA_Stream_TypeDef *stream);
void dma_transfer_error_callback(DMA_Stream_TypeDef *stream);

/* 调试接口 */
void dma_print_status(DMA_Stream_TypeDef *stream);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DMA_H */
